iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0
JavaScript

大學以前只看過那隻貓?用白話文帶你從 Python 跨進 JavaScript系列 第 5

【Day 5】繼承不是複製貼上!看 Teacher 如何共享 Person 的規格並擴充 subjectName

  • 分享至 

  • xImage
  •  

extends 就是「認乾爹領基礎包,轉身加裝個人外掛」!
想像現在要發行兩種進階卡片:「學生證」與「教師證」。
如果沒有繼承,公務員寫程式會寫到想摔鍵盤:
寫 Student:填姓名、填性別、寫學號……
寫 Teacher:填姓名、填性別、寫任教科系……(又重來一遍,手快斷了)
這時公務員突然開竅:「不管是老師還是學生,脫下職業外衣,他們骨子裡不都是個人(Person)!」
第一步:認老爸,基礎包直接打包帶走
身為人類,與生俱來就該有姓名、性別。既然老爸 Person 早就把這些欄位和檢驗窗口蓋好了,老師和學生只要霸氣在後面補上一句 extends Person(直接認老爸):
Java
// 學生證:繼承人類基礎包,外掛「學號」
public class Student extends Person {
private String studentId;
}

// 教師證:繼承人類基礎包,外掛「任教科目」
public class Teacher extends Person {
private String subject;
}
這行字寫下去的瞬間,就像領取了「人類豪華新手大禮包」:
姓名?老爸給了!
性別?老爸給了!
查閱窗口(Getter/Setter)?老爸早就建好了!
你的程式碼一行都沒重複抄,全盤直接端走,這就是所謂的子承父業,少奮鬥三十年。
第二步:不用重複寫程式碼,專注在自己的special的地方
領完基礎包之後,辦證窗口(建構子)就輕鬆多了。
外人來辦卡時,括號裡只要把資料整批丟進來:
辦學生證: 櫃台收下姓名、性別、學號。姓名性別轉身丟給老爸的建構子去填,自己只要專心把括號裡的學號填進專屬晶片裡。
辦教師證: 姓名性別同樣請老爸代勞,自己只要專注把括號裡的任教科目(例如「微積分」)貼上去。
一秒看懂身分區隔
走出辦事處後,他們在路上的狀態是這樣的:
當校長喊:「是人類的統統轉過來!」
老師和小明會一起轉頭,因為他們都是 Person,都有名字和性別。
當學校廣播:「請出示你的學號!」
只有小明拿得出 studentId;

雖然這是教師證,但卡片上的姓名與性別被父類別設定了 private。這代表只有父類別自己的建構子,才有權利拿工具把資料寫進去。
不能越權私刻:
兒子(Teacher)如果硬寫( this.name = ...),Java 就會立刻以「違反存取權限」紅字阻擋。
只能委託老爸代工:
所以才必須用 super(name, age) 把資料遞給老爸:「老爸,這台機器只有你打得開,請用你的建構子,幫我把這兩個欄位刻在我的卡片上!」
super(name, age);,背後發生的事情是這樣的:
public Teacher(String name, int age, String subjectName) {
// 1. 轉頭呼叫老爸的建構子:
// 「老爸,這是姓名跟年齡,麻煩你依照老規矩,把它們填進我(this)的晶片裡!」
super(name, age);

// 2. 老爸填完收工退場,兒子才接手處理自己的專屬欄位
this.subjectName = subjectName; 

}
整個過程就只有「這張教師證(this)」老爸先打底,兒子再加裝:
老爸的建構子被 super(...) 召喚過來,合法地替這張卡片把 name 和 age 寫好;老爸處理完後,子類別建構子才用 this.subjectName 把自己特有的「任教科目」貼上去。
在子類別的建構子裡,super(...) 必須寫在第一行,絕不能調換順序。
老爸先到位,基礎資料全部安全著陸,小孩才能放心地裝上自己的外掛配備!

寫在方法前面的 @Override 是什麼角色?
它就是貼在施工門口的告示牌:『本工程正在覆寫老爸講稿』。
工程師常常手滑打錯字,比如把 introduce() 不小心打成 introduct():
沒貼 @Override: Java 以為你只是隨便發明了一個無關緊要的新方法,編譯順利通過,但執行時你才發現老師根本沒改掉台詞,除錯除到半夜。
有貼 @Override: Java 編譯器就像嚴格的監工,看到告示牌會立刻核對老爸的規格。一發現老爸根本沒有 introduct(),它當場亮紅線打你手心:「你不是說要覆寫老爸嗎?老爸根本沒這招,你是不是字打錯了?!」
老爸那裡原本發了一份標準自我介紹講稿:
public void introduce() {
System.out.println("我是 " + name);
}
只要把 {} 裡面的程式碼重寫,之後只要叫老師 introduce(),他講出來的一定是升級後的台詞,不會去念老爸那套陽春版。
@Override
public void introduce() {
//大括號裡換上改版台詞!
System.out.println("大家好,我是 " + getName() + " 老師,專門教 " + this.subjectName);
}


上一篇
【Day 4】印卡機上的跑馬燈:看懂 static 共享與 final 焊死鐵則
下一篇
【Day 6】Java 規定只能有一個老爸怎麼辦?用 Interface 外掛你的第二個身分!
系列文
大學以前只看過那隻貓?用白話文帶你從 Python 跨進 JavaScript8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言